PpgDex is ECGDex’s optical twin — it senses one signal, the raw photoplethysmogram, finds each pulse, and from the interval series produces the same HRV family plus something neither ECG nor oximetry can: pulse-wave morphology.
Read the suite as a reflex arc: receptors → relay → integration → insight. PpgDex is an afferent receptor — it does exactly one transduction well and reports inward. It never reaches into another node; cross-signal work happens only through the Ganglior export, consumed by the Integrator.
PpgDex is built from external *.js files referenced by PpgDex.src.html and bundled to a standalone PpgDex.html. Dependencies point downhill only — UI → DSP → Core — and each file owns exactly one job. Edit the .js + .src.html, never the bundle; re-bundle after changes.
buildHash provenance stamp). 100% local.crossNight() stats stay per-node).tMs (local civil time encoded as if UTC) and reads it back with getUTC* — so the recording reads identically in any viewer’s timezone, and two devices recording the same minute land on the same tMs. parseTimestamp is duplicated locally by design.The pipeline is the same shape across the suite: ingest → parse on the canonical clock → compute in DSP → grade & render in UI → emit onto the bus. No number is computed in the render layer; it asks DSP for the value and the registry for how to show it.
Drop the multi-file export — PPG plus its companion ACC/GYRO/PPI/MARKER files. Sessions are keyed by floating t0Ms.
A soft-upstroke detector (Pan–Tompkins does not apply to PPG) finds systolic feet and peaks, yielding the PP interval series.
The ACC+GYRO motion gate — the signature feature — excludes movement-corrupted spans before HRV, since wrist optics are motion-sensitive.
Clean PPI drives the HRV suite; morph.js extracts rise time, dicrotic notch, augmentation/reflection indices and perfusion from the median pulse.
Export the node-export JSON. The wrist↔fingertip PTT that PPG alone can’t do is left to the Integrator.
Every metric PpgDex surfaces carries an evidence grade — a non-hue badge whose fill is the confidence ladder: solid bullseye for a raw reading, down to a dashed ring for a friendly estimate. A measurement and a projection must never look alike. Grades live in ppgdex-registry.js, the one source of truth.
Honesty is architectural: a guess is never dressed as a measurement, a missing value stays null rather than fabricated, and confidence is kept separate from signal quality. The node-specific caveats:
PPG has a soft upstroke, not a sharp QRS — so it uses a foot/peak detector, not Pan–Tompkins. The downstream HRV, once you have intervals, is identical to ECG’s.
Wrist optics corrupt easily under movement; the ACC+GYRO gate is mandatory, and excluded spans are shown greyed rather than guessed.
A single optical site cannot derive pulse-transit-time or blood pressure. That cross-site fusion lives in the Integrator, never faked here.
Augmentation, reflection and perfusion indices are something neither OxyDex nor ECGDex can produce — graded emerging because they are device-dependent.
PpgDex is one self-contained file. Open PpgDex.html in any browser — online, offline, or from file://. Nothing installs, nothing phones home.
Drag a Polar Verity Sense export (multi-file polar sense set) onto the upload zone. It’s read in-browser and turned into metrics on your device alone.
Start in Core for the headline readiness and a plain-language line. Step up to Advanced for full tables and charts, or Research for composites and the full dump. Each metric’s evidence dot tells you how far to trust it.
Export a ganglior.node-export JSON to feed the Integrator, or to upgrade a peer node’s read. Events carry a wall-clock t; consumers reconstruct absolute time from the recording start.
Edit the ppgdex-*.js files or PpgDex.src.html — never the bundled PpgDex.html — then re-bundle. Run Dex-Test-Suite.html until all-green, and verify-provenance.html after re-bundling.